package com.sukaiyi.leetcode._26remove_duplicates_from_sorted_array;

import org.junit.jupiter.api.Test;

import java.util.Arrays;

import static org.junit.jupiter.api.Assertions.*;

/**
 * 删除排序数组中的重复项
 * <p>
 * 给定一个排序数组，你需要在 原地 删除重复出现的元素，使得每个元素只出现一次，返回移除后数组的新长度。
 * 不要使用额外的数组空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成
 *
 * @author sukaiyi
 * @date 2020/04/30
 * @see <a href="https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/">题目地址</a>
 */
public class Solution {

    @Test
    public void test() {
        int[] nums = new int[]{0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
        assertEquals(removeDuplicates(nums), 5);
        assertArrayEquals(new int[]{0, 1, 2, 3, 4}, Arrays.stream(nums).limit(5).toArray());

        nums = new int[]{1, 1, 2};
        assertEquals(removeDuplicates(nums), 2);
        assertArrayEquals(new int[]{1, 2}, Arrays.stream(nums).limit(2).toArray());

        nums = new int[]{1, 1};
        assertEquals(removeDuplicates(nums), 1);
        assertArrayEquals(new int[]{1}, Arrays.stream(nums).limit(1).toArray());
    }


    public int removeDuplicates(int[] nums) {
        if (nums.length == 0 || nums.length == 1) {
            return nums.length;
        }
        int i = 0;
        int j = 0;
        while (j < nums.length) {
            for (; j < nums.length && nums[i] == nums[j]; j++) ;
            if (i + 1 < nums.length && j < nums.length) {
                int temp = nums[i + 1];
                nums[i + 1] = nums[j];
                nums[j] = temp;
                i++;
                j++;
            }
        }
        return i + 1;
    }
}
